因為我最終打算撰寫RESTful API,用以滿足存取資源的CRUD,所以勢必建立不同的Gateway API。接下來簡單解釋一點template.yaml的實作部分,如果之後增加內容的時候一樣會再重複提及。
首先我們看一下之前已經撰寫好的內容
AWSTemplateFormatVersion: 2010-09-09
Transform: "AWS::Serverless-2016-10-31"
Description: Lambda example
Resources:
HelloLambda:
Type: AWS::Serverless::Function
Properties:
Runtime: java8
Handler: com.amazonaws.lambda.demo.LambdaFunctionHandler::handleRequest
CodeUri: ./target/demo-1.0.0.jar
Events:
HelloLambdaApi:
Type: Api
Properties:
Path: /hello
Method: ANY
AWSTemplateFormatVersion: 2010-09-09
首先第一行是AWS template使用的版本定義,這邊目前只有唯一這個版本,相關的資訊是屬於AWS CloudFormation部分,用以定義AWS各種資源服務
Transform: "AWS::Serverless-2016-10-31"
第二行表示將使用到AWS::Serverless的轉換功能,AWS裡並沒有Serverless這項服務資源,而是提供將Serverless這個抽象的概念轉換對應到Lambda、API Gateway等其他服務。所以你也可以完整自己撰寫所有Lambda、API Gateway或其他資源描述,但是我相信使用Serverless轉換會更方便些。而這實際上是AWS Serverless Application Model (SAM)的open-source framework,完整或最新的內容應該要查找github的內容。
AWS Serverless Application Model (SAM)
轉換資源類型Serverless我們已經知道幾個properties的內容
Events我們已經試過簡單的使用/hello從而觸發我們的HelloLambda處理了request/response。而現在我打算撰寫Person的RESTful API,會需要針對Person資源的GET/POST/PUT/PATCH/DELETE等method type進行處理。看習慣,也可以每種類型對應一個handler進行處理,但我這裡稍微試著將類似的類型用同一個method處置。
譬如說我想要
對於person資源的查詢
GET /person
針對person_id的資源內容取得
GET /person/{person_id}
template當中可以這麼寫
GetPerson:
Type: AWS::Serverless::Function
Properties:
Runtime: java8
Handler: com.amazonaws.lambda.demo.PersonHandler::queryPerson
CodeUri: ./target/demo-1.0.0.jar
Events:
QueryPersonApi:
Type: Api
Properties:
Path: /person
Method: GET
GetPersonApi:
Type: Api
Properties:
Path: /person/{person_id}
Method: GET
當然我需要建立對應的PersonHandler class以及queryPerson method,不過當中我只需要判斷path是否存在person_id即可覺得是甚麼樣的資源要求了
接下來是新增/修改資料的POST, PUT, PATCH
UpdatePerson:
Type: AWS::Serverless::Function
Properties:
Runtime: java8
Handler: com.amazonaws.lambda.demo.PersonHandler::updatePerson
CodeUri: ./target/demo-1.0.0.jar
Events:
PostPersonApi:
Type: Api
Properties:
Path: /person/{person_id}
Method: POST
PutPersonApi:
Type: Api
Properties:
Path: /person/{person_id}
Method: PUT
PatchPersonApi:
Type: Api
Properties:
Path: /person/{person_id}
Method: PATCH
你會發現,雖然在SAM Local Mounting的時候最終還是會整合在同一個,但是Events單中必須各自描述定義
DELETE就比較單純了
DletePerson:
Type: AWS::Serverless::Function
Properties:
Runtime: java8
Handler: com.amazonaws.lambda.demo.PersonHandler::deletePerson
CodeUri: ./target/demo-1.0.0.jar
Events:
DeletePersonApi:
Type: Api
Properties:
Path: /person/{person_id}
Method: DELETE
這時候只要我們已經有正確的handler實作,SAM Local啟動時就可以正確看到API Gateway事件被掛載上去了
Mounting UpdatePerson at http://127.0.0.1:3000/person/{person_id} [PATCH, POST, PUT]
Mounting GetPerson at http://127.0.0.1:3000/person [GET]
Mounting DletePerson at http://127.0.0.1:3000/person/{person_id} [DELETE]
Mounting GetPerson at http://127.0.0.1:3000/person/{person_id} [GET]